package main

import (
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"go-xorm-01/utils"
	"time"
	"xorm.io/xorm"
	"xorm.io/xorm/log"
	"xorm.io/xorm/names"
)

var engine *xorm.Engine

// 创建时间Created:https://xorm.io/zh/docs/chapter-04/1.created/
// Created可以让您在数据插入到数据库时自动将对应的字段设置为当前时间，
// 需要在xorm标记中使用created标记，如下所示进行标记，对应的字段可以为time.Time或者自定义的time.Time或者int,int64等int类型。
func main() {
	SnakeMapper()
	insertOneUser(engine)

	defer engine.Close()
}

// insertOneUser
//
//	@Description: 插入一条(推荐使用指针)
//	@param engine
func insertOneUser(engine *xorm.Engine) {
	var u *UserCreated = &UserCreated{
		Username: "zhangsan-time",
		Password: "123456"}
	insert, err := engine.Insert(u)
	if err != nil {
		fmt.Printf("insert err:%v", err)
	}
	fmt.Println(insert)
	fmt.Printf("id= %d", (*u).Id)

}

// SnakeMapper
//
//	@Description: SnakeMapper支持struct为驼峰式命名，表结构为下划线命名之间的转换，这个是默认的Mapper
func SnakeMapper() {
	engine = utils.GenerateEngine()
	engine.SetMapper(names.SnakeMapper{}) // SnakeMapper 【默认】
	err := engine.Sync2(new(UserCreated))
	if err != nil {
		fmt.Printf("err:%v", err)
	}
	engine.ShowSQL(true)
	engine.SetLogLevel(log.LOG_DEBUG)

}

type JsonTime time.Time

func (j JsonTime) MarshalJSON() ([]byte, error) {
	return []byte(`"` + time.Time(j).Format("2006-01-02 15:04:05") + `"`), nil
}

// UserCreated
// @Description: UserCreated
type UserCreated struct {
	Id        int64 `xorm:"pk autoincr"` //指定列名 ，默认id
	Username  string
	Password  string
	TimeOne   time.Time `xorm:"created"`
	TimeTwo   JsonTime  `xorm:"created"`
	TimeThree int64     `xorm:"created"`
}

// TableName
//
//	@Description: 指定表名：默认为:user_created
//	@receiver u
//	@return string
func (u UserCreated) TableName() string {
	return "user_created"
}
